home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / msginfil.i < prev    next >
Text File  |  1997-10-26  |  36KB  |  1,010 lines

  1. IMPLEMENTATION MODULE MsgInfile;
  2.  
  3. (*==============================================================*
  4.  * Modul:               CAT-Infilehandler, dritte Version       *
  5.  * Autor:               Dirk Steins                             *
  6.  * erstellt am:         29.10.1992                              *
  7.  * letzte Žnderung am:  26.12.1992                              *
  8.  * Version:             0.7                                     *
  9.  * Interne Version:     V#0007                                  *
  10.  *==============================================================*
  11.  
  12.   Dieses Modul erstellt neue Nachrichten, managt diese und verwaltet die neuen
  13.   Nummern und erstellt auch das Infile.
  14.   Es wird fr jede Nachricht ein Typ festgelegt, und in den HDR-Dateien zu jeder 
  15.   Message werden alle Informationen festgehalten, so daž jederzeit eine Žnderung
  16.   in einen anderen Messagetyp m”glich ist.
  17.   Die Infos im Speicher zu den Messages werden in einem dynamischen Array fest-
  18.   gehalten, das passend alloziert wird.
  19.   Die Header-Dateien bestehen aus 7 Textzeilen, die folgende Informationen 
  20.   enthalten:
  21.   
  22.         Eingabedatum im MausTausch-Format                               (E-Zeile)
  23.         Empf„nger (fr Pers”nliche Nachrichten)                         (A-Zeile)
  24.         Ursprungsgruppe (Leer fr Antworten auf pers. Nachrichten)
  25.         Zielgruppe (Leer fr pers”nliche Nachrichten)                   (G-Zeile)
  26.         Referenznummer (kommentierte ID)                                (- Zeile)
  27.         Stichwort                                                       (W-Zeile)
  28.         Original-ID der kommentierten Nachricht (MId)                   (R-Zeile)
  29.   
  30.   Wenn der Typ der Nachrichten nicht ge„ndert wird, dann k”nnen einige Zeilen
  31.   auch leer sein. Immer gefllt ist nur die Datumszeile!
  32.  
  33.   Beim Erstellen des Infiles werden evtl. vorhandene Tabulatoren in den
  34.   Messages in Leerzeichen gewandelt. 
  35.   Ob Endloszeilen an die Maus geschickt werden oder nicht, ist einstellbar.
  36.  
  37.  *----------------------------------------------------------------------------
  38.  * Datum    Vers. Autor  Žnderung (Arbeitsbericht)                            
  39.  *----------------------------------------------------------------------------
  40.  * 29.10.92 0001  DS    Erste Version
  41.  * 02.11.92 0002  DS    L„uft recht stabil, Fenster ist auch schon da,
  42.  *                      editieren geht auch schon. 
  43.  * 02.11.92 0003  DS    Fenster funktioniert, Buttons im Fenster auch,
  44.  *                      alle Features implementiert!
  45.  * 10.11.92 0004  DS    Bugs korrigiert. Distribution eingebaut.
  46.  *                      Erweiterungen fr Maus 9 eingebaut: D-Zeile  
  47.  * 26.12.92 0006  DS    Distribution auch ber Popup im Editor und ber Buttons
  48.  *                      einstellbar.
  49.  * 10.03.93 0007  DS    Datum wird in ID fr die Maus mit eincodiert und auch 
  50.  *                      beim identifizieren berprft.
  51.  * 15.07.95 0008  DS    Modul aufgespalten in drei Module fr Port auf HM2
  52.  *                      Dieser Part erstellt nur noch das Infile. Der Zugriff
  53.  *                      auf die Strukturen und Daten erfolgt ber ein anderes
  54.  *                      Modul
  55.  *
  56.  *
  57.  *----------------------------------------------------------------------------
  58.  *)
  59.  
  60. FROM SYSTEM     IMPORT  TSIZE, ADDRESS, ADR, CALLSYS, CADR, BYTE, ASSEMBLER, LOC;
  61.  
  62.  
  63. (* MM2-Module *)
  64. IMPORT Block, Strings, StrConv, GrafBase, BinOps, MOSGlobals,
  65.        Keyboard, Characters;
  66. FROM Keyboard  IMPORT SpecialCode;
  67. FROM Storage    IMPORT ALLOCATE, DEALLOCATE;
  68.  
  69.  
  70. (* Magic-Module *)
  71. IMPORT MagicAES, MagicVDI, MagicDOS, MagicFSM, mtTextfiles, mtAlerts, mtAppl,
  72.        mtUtils, mtDials, mtPopups, MagicXBIOS, MagicStrings;
  73. FROM MagicSys   IMPORT Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7,
  74.                        Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14, Bit15;
  75. IMPORT Mintbind;
  76.  
  77. (* CAT-Module *)
  78. IMPORT ARCStarter, CatFiles, CatTypes, MTE, MTEdit2, 
  79.        CatEdit, FontSelect, WdwManager, VDIStandards, ConfVars,
  80.        CatGlobal, EditTypes, MausTauschrsc, grinTools, ListHelp,
  81.        grin, data, dataSys, QuickSort, Varnames, Infofiles, RectFuncs,
  82.        GroupSelect, IoFilter, WinDials, Protokoll;
  83.  
  84. FROM CatGlobal   IMPORT OpenName;
  85. FROM MTPaths     IMPORT MessagePath, DataPath, ExportPath, ImportPath, ARCName;
  86. IMPORT ConvertDate;
  87. FROM UserInformation IMPORT UserBLK, batchProcess;
  88. FROM Void        IMPORT v;
  89.  
  90. IMPORT Messages, MsgWindow;
  91.  
  92. FROM Messages IMPORT    MessageType;
  93.  
  94. CONST   
  95.         saveSize    = 40L;   (* Sicherheitsgrenze beim Splitten von Nachrichten *)
  96.  
  97.         infile      = 'infile.txt'+0C;
  98.         devGroup    = 'MT.CAT.DEV'+0C;
  99.  
  100. PROCEDURE Transfer(InHandle, INFILE : mtTextfiles.TEXTFILE; c : CHAR);
  101. VAR str : ARRAY[0..2047] OF CHAR;
  102.     outStr : ARRAY [0..2047] OF CHAR;
  103.     ch  : CHAR;
  104.     newLine : BOOLEAN;
  105. BEGIN
  106.   newLine := TRUE;
  107.   REPEAT
  108.     mtTextfiles.ReadLine (InHandle, str);
  109.     mtTextfiles.ReadChar (InHandle, ch);     (* Liest Ende-Zeichen der Zeile *)
  110.     CatGlobal.ConvertTabs (str, outStr, UserBLK.tabSize);
  111.  
  112.     (* Blockschutz wie JellyCat *)
  113.     IF Characters.IsSpace (str[0]) & ~newLine
  114.     THEN
  115.       mtTextfiles.WriteLn (INFILE);
  116.       newLine := TRUE;
  117.     END;
  118.     
  119.     IF newLine THEN
  120.       IF c # 0C THEN 
  121.         mtTextfiles.WriteChar(INFILE, ':') 
  122.       END;
  123.       newLine := FALSE;
  124.     END;
  125.     mtTextfiles.WriteLine (INFILE, outStr);     (* Zeile ausgeben *)
  126.     IF (ch = 15C) (* CR *) OR mtTextfiles.EndofText (InHandle) 
  127.        OR ~UserBLK.endlessLines
  128.     THEN
  129.       (* Richtiges Zeilenende *)
  130.       mtTextfiles.WriteLn (INFILE);
  131.       newLine := TRUE;
  132.       IF ch = 15C THEN mtTextfiles.ReadLn(InHandle); END;
  133.     END;
  134.   UNTIL mtTextfiles.EndofText (InHandle);
  135. END Transfer;
  136.  
  137. PROCEDURE TrickyOpen(REF p, n : ARRAY OF CHAR; mode : mtTextfiles.Textmode;
  138.                      buff : CARDINAL; VAR f : mtTextfiles.TEXTFILE):BOOLEAN;
  139. VAR fn : CatTypes.String255;
  140. BEGIN
  141.   Strings.Assign(p, fn, v.bool);
  142.   Strings.Append(n, fn, v.bool);
  143.   RETURN 
  144.     mtTextfiles.OpenTextfile(fn, mode, buff, f) (* OR
  145.     (* Bei Buffergr”že = 0 wird ein 32 kB buffer genommen, das klappt dann 
  146.      * noch weniger, daher nehmen wir jetzt einen 512 Byte Buffer, die sollten
  147.      * immer frei sein
  148.      *)
  149.     mtTextfiles.OpenTextfile(fn, mode,  512, f); *)
  150. END TrickyOpen;
  151.  
  152. PROCEDURE splitMessage (VAR idx : INTEGER; msg: Messages.msgInfo);
  153.   VAR tmp       : Messages.msgInfo;
  154.       orgGroup,
  155.       msgName,
  156.       tmpName   : CatTypes.String255;
  157.       numExtension: CatTypes.extStrType;
  158.       msgNum    : INTEGER;
  159.       i,
  160.       pNumber   : CARDINAL;
  161.       source,
  162.       tmpFile   : mtTextfiles.TEXTFILE;
  163.       bCount    : LONGCARD;
  164.       str, 
  165.       outStr    : CatTypes.String1023;
  166.       ch        : CHAR;
  167.       tmpMsg    : Messages.msgInfo;
  168.       refName   : CatTypes.nameStrType;
  169.       newType   : Messages.MessageType;
  170.       orgHasCopies: BOOLEAN;
  171.       orgMsg    : Messages.msgInfo;
  172.       count,
  173.       tmpCount  : INTEGER;
  174.       j         : INTEGER;
  175.   
  176.   PROCEDURE makeTmpName (msgNum : INTEGER; number : CARDINAL);
  177.   BEGIN
  178.     Strings.Assign (StrConv.NumToStr (number, 36, 3, '0'), numExtension, v.bool);
  179.     Messages.Number2Name (msgNum, tmpName);
  180.     Strings.Append ('.', tmpName, v.bool);
  181.     Strings.Append (numExtension, tmpName, v.bool);
  182.   END makeTmpName;
  183.   
  184.   PROCEDURE readSourceLine();
  185.   BEGIN
  186.     mtTextfiles.ReadLine (source, str);
  187.     mtTextfiles.ReadChar (source, ch);        (* Liest Ende-Zeichen *)
  188.     IF ch = 15C THEN mtTextfiles.ReadLn (source); END;
  189.     CatGlobal.ConvertTabs (str, outStr, UserBLK.tabSize);
  190.   END readSourceLine;
  191.  
  192.   PROCEDURE writeTargetLine();
  193.   BEGIN  
  194.     INC (bCount, LENGTH (outStr));
  195.     mtTextfiles.WriteLine (tmpFile, str);   (* str schreiben, nicht die ohne Tabs! *)
  196.     IF (ch = 15C) OR mtTextfiles.EndofText (source) (* CR da oder EndOfText *)
  197.     THEN
  198.       mtTextfiles.WriteLn (tmpFile);        (* CR/LF schreiben *)
  199.       INC (bCount, 2);                      (* Zwei Bytes geschrieben *)
  200.     ELSE
  201.       mtTextfiles.WriteChar (tmpFile, 12C); (* LF schreiben *)
  202.       INC (bCount);
  203.     END;
  204.   END writeTargetLine;
  205.   
  206.   PROCEDURE updateMsgSize (VAR msg : Messages.msgInfo);
  207.     VAR idx2 : INTEGER;
  208.   BEGIN
  209.     msg.size := Messages.FileSize (MessagePath, msgName, v.card, v.card);
  210.     msg.new := FALSE;
  211.     idx2 := Messages.FindMessage (msg.number);
  212.     IF idx2 >= 0 THEN Messages.msgArray^[idx2] := msg; END;
  213.   END updateMsgSize;
  214.   
  215.   PROCEDURE buildSubject (REF inTopic: ARRAY OF CHAR; 
  216.                           VAR outTopic: ARRAY OF CHAR;
  217.                           part: CARDINAL);
  218.     (* H„ngt einen String (x/y) an den Betreff an *)
  219.     VAR num: ARRAY [0..79] OF CHAR;
  220.         maxLen : CARDINAL;
  221.   BEGIN
  222.     Strings.Assign (inTopic, outTopic, v.bool);
  223.     Strings.Assign (" (", num, v.bool);
  224.     Strings.Append (StrConv.CardToStr (part, 0), num, v.bool);
  225.     Strings.Append ("/", num, v.bool);
  226.     Strings.Append (StrConv.CardToStr (pNumber, 0), num, v.bool);
  227.     Strings.Append (")", num, v.bool);
  228.     Strings.Append (num, outTopic, v.bool);
  229.   END buildSubject; 
  230.   
  231.   PROCEDURE updateSubject (VAR msg: Messages.msgInfo; REF subj: ARRAY OF CHAR);
  232.   BEGIN
  233.     WITH msg DO
  234.       IF topic # NIL THEN DEALLOCATE (topic, 0); END;
  235.       ALLOCATE (topic, LENGTH (subj)+2);
  236.       IF topic = NIL
  237.       THEN
  238.         HALT
  239.       END;
  240.       Strings.Assign (subj, topic^, v.bool);
  241.       Messages.WriteHdrInfo (msg);
  242.     END;
  243.   END updateSubject;
  244.   
  245. BEGIN
  246.   (* Das wird jetzt wirklich Arbeit: Eine Message 
  247.    * an der richtigen Stelle aufsplitten
  248.    *)
  249.   (* Vorgehensweise: Damit die Nachrichten alle hintereinander eingefgt 
  250.    * werden, mssen die auch hintereinander im Messagearray stehen.
  251.    * Die Nummern mssen aber nicht aufeinanderfolgend sein!
  252.    * Deshalb wird die Originalnachricht an das Ende des Messagearrays kopiert
  253.    * bzw. der Eintrag ausgetauscht, und dann werden weitere
  254.    * Nachrichten hinten dran geh„ngt.
  255.    *)
  256.   (* Erst mal im Messagearray tauschen *)
  257.   IF ~msg.hdrRead
  258.   THEN
  259.     Messages.ReadHdrInfo (msg, TRUE);
  260.   END;
  261.   IF ~msg.hdrRead
  262.   THEN 
  263.     RETURN ;
  264.   END;
  265.   tmp := Messages.msgArray^[Messages.messages-1];
  266.   Messages.msgArray^[Messages.messages-1] := msg;
  267.   Messages.msgArray^[idx] := tmp;
  268.   orgHasCopies := msg.copyCount > 0;
  269.   orgMsg := msg;
  270.   DEC (idx);
  271.   (* Jetzt Namen zusammensetzen *)
  272.   Messages.Number2Name (msg.number, msgName);
  273.   Strings.Append (CatTypes.textExt, msgName, v.bool);
  274.   (* Jetzt wird die Originalnachricht in Files unterteilt,
  275.    * die eine durchnummerierte Extension haben, also .001, .002 etc.
  276.    *)
  277.   pNumber := 1;
  278.   IF TrickyOpen (MessagePath, msgName, mtTextfiles.READ, 16384, source)
  279.   THEN
  280.     (* Damit es nicht so schnell zu einem šberlauf der Extension kommt, 
  281.      * wird diese im 36er-System kodiert.
  282.      *)
  283.     makeTmpName(msg.number, pNumber);
  284.     IF ~TrickyOpen (MessagePath, tmpName, mtTextfiles.WRITE, 16384, tmpFile)
  285.     THEN
  286.       (* Fehlermeldung ausgeben und abbrechen, alle tmp-Files wieder l”schen *)
  287.       MTE.info (MTE.noTmpSplitFile);
  288.       mtTextfiles.CloseTextfile (source);
  289.       RETURN
  290.     END;
  291.     bCount := 0;
  292.     WHILE ~mtTextfiles.EndofText (source) DO
  293.       readSourceLine();
  294.       WHILE ~mtTextfiles.EndofText (source) & (bCount + LONG(LENGTH (outStr)) + saveSize < LONGCARD(UserBLK.splitSize)) DO
  295.         writeTargetLine();
  296.         readSourceLine();
  297.       END;
  298.       IF bCount + LONG(LENGTH (outStr)) + saveSize < LONGCARD(UserBLK.splitSize)
  299.       THEN
  300.         (* noch rausschreiben *)
  301.         writeTargetLine();
  302.       ELSE
  303.         (* Gr”že berschritten! Also tmpFile schliežen und neues anlegen! *)
  304.         mtTextfiles.CloseTextfile (tmpFile);
  305.         INC (pNumber);
  306.         IF pNumber = 46656 
  307.         THEN
  308.           (* Damit wrde die dritte Stelle in der Extension
  309.            * berschritten und ein šberlauf auftreten. 
  310.            * Dieser Fall ist aber sehr unwahrscheinlich, da
  311.            * man dazu eine Message von ca. 560 MB schreiben mžte!
  312.            * Vorher ist wahrscheinlich die Platte voll oder Fehler
  313.            * sind aufgetreten.
  314.            *)
  315.           HALT
  316.         END;
  317.         makeTmpName(msg.number, pNumber);
  318.         IF ~TrickyOpen (MessagePath, tmpName, mtTextfiles.WRITE, 16384, tmpFile)
  319.         THEN
  320.           (* Fehlermeldung ausgeben und abbrechen, alle tmp-Files wieder l”schen *)
  321.           MTE.info (MTE.noTmpSplitFile);
  322.           FOR i := 1 TO pNumber - 1 DO
  323.             Strings.Assign (StrConv.NumToStr (i, 36, 3, '0'), numExtension, v.bool);
  324.             Messages.Number2Name (msg.number, tmpName);
  325.             Strings.Append ('.', tmpName, v.bool);
  326.             Strings.Append (numExtension, tmpName, v.bool);
  327.             v.bool := CatFiles.DeleteFile (MessagePath, tmpName);
  328.           END;
  329.           mtTextfiles.CloseTextfile (source);
  330.           RETURN
  331.         END;
  332.         (* noch rausschreiben *)
  333.         bCount := 0;
  334.         writeTargetLine();
  335.       END;
  336.     END;
  337.     (* jetzt haben wir die Nachricht verteilt in pNumber tempor„re Files *)
  338.     mtTextfiles.CloseTextfile (tmpFile);
  339.     mtTextfiles.CloseTextfile (source);
  340.   ELSE
  341.     (* Fehlermeldung *)
  342.     MTE.info (MTE.noMsgSplitFile);
  343.     RETURN 
  344.   END;
  345.   (* Jetzt werden die Dateien umbenannt und viele neue Kommentare angelegt *)
  346.   v.bool := CatFiles.DeleteFile (MessagePath, msgName);
  347.   i := 1;
  348.   makeTmpName (msg.number, 1);
  349.   v.bool := CatFiles.RenameFile (MessagePath, tmpName, MessagePath, msgName);
  350.   INC (i);
  351.   msgNum := msg.number;
  352.   updateMsgSize (msg);
  353.   IF msg.topic # NIL
  354.   THEN
  355.     Strings.Assign (msg.topic^, str, v.bool);
  356.   ELSE
  357.     Strings.Assign ("(no Subject)", str, v.bool);
  358.   END;   
  359.   buildSubject (str, outStr, 1);
  360.   updateSubject (msg, outStr);
  361.   Messages.UpdateEditors (msg);
  362.   IF (msg.msgType = answer) OR (msg.msgType = persanswer) OR (msg.msgType = private)
  363.   THEN
  364.     (* pers”nliche Nachricht gleichen Typs anlegen *)
  365.     newType := msg.msgType;
  366.   ELSE
  367.     (* Kommentar auf eigene Nachricht anlegen *)
  368.     newType := comment;
  369.   END;
  370.   WHILE i <= pNumber DO
  371.     Messages.ReadHdrInfo (msg, TRUE);
  372.     IF ~msg.hdrRead
  373.     THEN
  374.       RETURN;
  375.     END;
  376.     IF msg.msgType # answer
  377.     THEN
  378.       Messages.MakeMausId (msg, refName);
  379.     ELSE
  380.       Strings.Assign (msg.refId^, refName, v.bool);
  381.     END;  
  382.     IF LENGTH(msg.orgGroup^) > 0 
  383.     THEN
  384.       MagicStrings.Assign (msg.orgGroup^, orgGroup);
  385.     ELSE
  386.       MagicStrings.Assign (msg.group^, orgGroup);
  387.     END;
  388.     buildSubject (str, outStr, i);
  389.     
  390.     IF Messages.CreateMessage (msg.number, msg.receiver^, orgGroup, msg.group^, refName, outStr, 
  391.                                msg.realName^, newType, 0, '', '', msg.dist, FALSE, v.int)
  392.     THEN
  393.       msg := Messages.msgArray^[Messages.messages-1];
  394.       Messages.Number2Name (msg.number, msgName);
  395.       Strings.Append (CatTypes.textExt, msgName, v.bool);
  396.       makeTmpName (msgNum, i);
  397.       v.bool := CatFiles.RenameFile (MessagePath, tmpName, MessagePath, msgName);
  398.       updateMsgSize (msg);
  399.       IF orgHasCopies
  400.       THEN
  401.         FOR count := 1 TO orgMsg.copyCount DO
  402.           (* Kopie Nr. j suchen und dann zur gerade erstellten wieder
  403.            * eine Kopie anlegen mit den gleichen Daten
  404.            *)
  405.           FOR j := 0 TO Messages.messages - 1 DO
  406.             tmpCount := 1;
  407.             IF (Messages.msgArray^[j].msgType = copyOwn) 
  408.              & (Messages.msgArray^[j].refNum = orgMsg.number)
  409.              & Messages.msgArray^[j].sendMsg 
  410.             THEN
  411.               IF tmpCount = count
  412.               THEN
  413.                 (* Richtige Kopie gefunden, Kopie zu msg anlegen *)
  414.                 IF ~Messages.msgArray^[j].hdrRead
  415.                 THEN
  416.                   Messages.ReadHdrInfo (Messages.msgArray^[j], FALSE);
  417.                   IF ~Messages.msgArray^[j].hdrRead
  418.                   THEN
  419.                     RETURN;
  420.                   END;
  421.                 END;
  422.                 Messages.Number2Name (msg.number, msgName);
  423.                 Strings.Assign (Messages.msgArray^[j].topic^, str, v.bool);
  424.                 buildSubject (str, outStr, i);
  425.                 Messages.CopyOwnMessage (msgName, Messages.msgArray^[j].receiver^, Messages.msgArray^[j].realName^, outStr, j);
  426.                 IF i = pNumber
  427.                 THEN
  428.                   (* Kommentare der Originalkopien auch anpassen 
  429.                    *)
  430.                   IF Messages.msgArray^[j].topic # NIL
  431.                   THEN
  432.                     Strings.Assign (Messages.msgArray^[j].topic^, str, v.bool);
  433.                   ELSE
  434.                     Strings.Assign ("(no Subject)", str, v.bool);
  435.                   END;
  436.                   buildSubject (str, outStr, 1);
  437.                   updateSubject (Messages.msgArray^[j], outStr);
  438.                 END;
  439.               ELSE
  440.                 INC (tmpCount);
  441.               END;
  442.             END;
  443.           END;
  444.         END;
  445.       END;
  446.       (* Jetzt erst i updaten, da wir ansonsten evtl. eine falsche
  447.        * Nummer ins Stichwort schreiben 
  448.        *)
  449.       INC (i);
  450.     ELSE
  451.       RETURN
  452.     END;
  453.   END;
  454. END splitMessage;
  455.  
  456. PROCEDURE LineOut (file : mtTextfiles.TEXTFILE; ch : ARRAY OF CHAR; REF str : ARRAY OF CHAR);
  457. BEGIN
  458.   IF ch[0] # 0C THEN mtTextfiles.WriteLine (file, ch); END;
  459.   mtTextfiles.WriteLine (file, str);
  460.   mtTextfiles.WriteLn (file);
  461. END LineOut;
  462.  
  463. PROCEDURE CalcPercent (val: LONGCARD; mul, div: LONGCARD): LONGCARD;
  464. BEGIN
  465.   IF val < (MAX(LONGCARD) DIV mul)
  466.   THEN
  467.     RETURN (val * mul) DIV div;
  468.   ELSE
  469.     RETURN (val DIV div) * mul;
  470.   END;
  471. END CalcPercent;
  472.  
  473. PROCEDURE GetFreeSpace (VAR num : ARRAY OF CHAR);
  474.   VAR mFree, iFree : LONGCARD;
  475.       dInfo        : MagicDOS.DISKINFO;
  476.       packed       : BOOLEAN;
  477.       sameDrive    : BOOLEAN;
  478. BEGIN
  479.   (* Platz auf Data- und Import-Laufwerk holen *)
  480.   (* MagicDOS.Dfree (dInfo, ORD (CAP(DataPath[0])) - ORD('A') + 1); *)
  481.   CatGlobal.PathFree (dInfo, DataPath);
  482.   mFree := dInfo.bFree * dInfo.bSecsiz * dInfo.bClsiz;
  483.   sameDrive := CAP(DataPath[0]) = CAP(ImportPath[0]);
  484.   IF ~sameDrive
  485.   THEN
  486.     (* MagicDOS.Dfree (dInfo, ORD (CAP(ImportPath[0])) - ORD('A') + 1); *)
  487.     CatGlobal.PathFree (dInfo, ImportPath);
  488.     iFree := dInfo.bFree * dInfo.bSecsiz * dInfo.bClsiz;
  489.   END;
  490.   packed := ARCName[0] # '';
  491.   (* Jetzt haben wir vier F„lle: 
  492.    * 1. gepackt und gleiches Laufwerk            : min ((xarc*.30)+xarc+xarc*1.2)  xarc = free / 2.5 =>>> arc = 12% free!
  493.    * 2. gepackt und unterschiedliche Laufwerke   : min (80% mDrv, (xarc*.3) + xarc) xarc = free / 1.3
  494.    * 3. ungepackt und gleiches Laufwerk          : 80% von min (iDrv, mDrv) / 2       ==>> (free / 2.5)
  495.    * 4. ungepackt und unterschiedliche Laufwerke : min (90% iDrv, 80% mDrv)
  496.    *)
  497.   IF packed
  498.   THEN
  499.     IF sameDrive 
  500.     THEN
  501.       (* Nur 12% insgesamt fr Archiv verfgbar *)
  502.       mFree := CalcPercent (mFree, 2, 7);  (* (mFree * 2) DIV 7; *)
  503.     ELSE
  504.       (* Minimum von 80% Databaselaufwerk, 23% Importlaufwerk *)
  505.       mFree := BinOps.LowerLCard (CalcPercent (mFree, 8, 10), CalcPercent (iFree, 10, 15));
  506.       (*  mFree := BinOps.LowerLCard ((mFree * 8) DIV 10, (iFree * 10) DIV 15); *)
  507.     END;
  508.   ELSE
  509.     IF sameDrive
  510.     THEN
  511.       (* 80% von freier Platz/2 *)
  512.       mFree := CalcPercent (mFree, 2, 5); (* mFree := (mFree * 2) DIV 5; *)
  513.     ELSE
  514.       (* Minimum von 90% Importlaufwerk, 80% Databaselaufwerk *)
  515.       mFree := BinOps.LowerLCard (CalcPercent (mFree, 8, 10), CalcPercent (iFree, 9, 10));
  516.       (* mFree := BinOps.LowerLCard ((mFree * 8) DIV 10, (iFree * 9) DIV 10); *)
  517.     END;
  518.   END;
  519.   Strings.Assign (StrConv.CardToStr (mFree, 0), num, v.bool);
  520. END GetFreeSpace;
  521.  
  522. PROCEDURE SetHeaderLine (VAR msg: Messages.msgInfo; line: Messages.lineType; REF str: ARRAY OF CHAR);
  523.   VAR oldPtr: CatTypes.Str1023Ptr;
  524. BEGIN
  525.   WITH msg DO
  526.     oldPtr := strings[line];
  527.     ALLOCATE (strings[line], LENGTH(str)+2);
  528.     IF strings[line] = NIL
  529.     THEN
  530.       IF LENGTH (str) <= LENGTH (oldPtr^)
  531.       THEN
  532.         strings[line] := oldPtr;
  533.         oldPtr := NIL;
  534.       END;
  535.     END;
  536.     IF strings[line] # NIL
  537.     THEN
  538.       MagicStrings.Assign (str, strings[line]^);
  539.     ELSE
  540.       MTE.noMemAlert();
  541.     END;
  542.     IF oldPtr # NIL
  543.     THEN
  544.       DEALLOCATE (oldPtr, 0);
  545.     END;
  546.   END;
  547. END SetHeaderLine;
  548.  
  549. PROCEDURE MakeInFile(): BOOLEAN;
  550. VAR InHandle, 
  551.     INFILE   : mtTextfiles.TEXTFILE;
  552.     res      : INTEGER;
  553.     i, j     : INTEGER;
  554.     numStr   : CatTypes.String255;
  555.     msg      : Messages.msgInfo;
  556.     alt, 
  557.     tmpName, 
  558.     msgName  : CatTypes.String255;
  559.     msgSize  : LONGCARD;
  560.     isDa     : BOOLEAN;
  561.     cDt,
  562.     cTi      : CARDINAL;
  563.     dt       : ConvertDate.Date;
  564.     ti       : ConvertDate.Time;
  565.     userCmds : BOOLEAN;
  566.     itkCmds  : BOOLEAN;
  567.     itkCmdMax: INTEGER;
  568.     itkCmdVal: CatTypes.Str1023Ptr;
  569.  
  570. BEGIN
  571.   (* Pre-Messages Filter aufrufen *)
  572.   isDa := FALSE;
  573.   IF IoFilter.IoFilterMessage(isDa)
  574.   THEN
  575.     Messages.ReReadMessageInfo ();
  576.   ELSIF isDa 
  577.   THEN
  578.     (* Fehler aufgetreten *)
  579.     mtAppl.MouseArrow();
  580.     RETURN FALSE;
  581.   END;
  582.   (* Jetzt Infile.txt erstellen *)
  583.   IF ARCName[0] = 0C THEN
  584.     IF ~TrickyOpen(ExportPath, infile, mtTextfiles.WRITE, 16384, INFILE) THEN
  585.       mtAppl.MouseArrow();
  586.       MTE.InfoAlert (MTE.noFile1, infile, MTE.noFile3);
  587.       RETURN FALSE;
  588.     END;
  589.   ELSE
  590.     IF ~TrickyOpen(MessagePath, infile, mtTextfiles.WRITE, 16384, INFILE) THEN
  591.       mtAppl.MouseArrow();
  592.       MTE.InfoAlert (MTE.noFile1, infile, MTE.noFile3);
  593.       RETURN FALSE
  594.     END;
  595.   END;
  596.  
  597.   CatGlobal.busyMouse();
  598.   itkCmds := ConfVars.GetConfigInt (cItkCmdMax, itkCmdMax);
  599.   userCmds := FALSE;
  600.   IF TrickyOpen(MessagePath, CatTypes.userCmdFile, mtTextfiles.READ, 2048, InHandle) THEN
  601.     userCmds := TRUE;
  602.     mtTextfiles.CloseTextfile(InHandle);
  603.   END;
  604.   IF UserBLK.getPer OR UserBLK.getAllg OR UserBLK.getInf OR itkCmds OR userCmds THEN
  605.     mtTextfiles.WriteConst(INFILE, '#CMD'); mtTextfiles.WriteLn(INFILE);
  606.  
  607.     IF UserBLK.groupChangeToIn THEN  (* zuerst die Gruppenummeldungen *)
  608.       isDa := GroupSelect.GetGroupChange (numStr, GroupSelect.GFIRST);
  609.       WHILE isDa DO
  610.         LineOut (INFILE, ':G', numStr);
  611.         isDa := GroupSelect.GetGroupChange (numStr, GroupSelect.GNEXT);
  612.       END;
  613.       (* So, und das hier muž trotzdem da bleiben, da man sonst keine User mehr 
  614.        * eintragen kann! 
  615.        *)
  616.       IF TrickyOpen(MessagePath, CatTypes.grSelect, mtTextfiles.READ, 2048, InHandle) THEN
  617.         Transfer(InHandle, INFILE, 0C);
  618.         mtTextfiles.CloseTextfile(InHandle);
  619.       END;
  620.       
  621.     END;
  622.  
  623.     IF UserBLK.getPer THEN
  624.       LineOut (INFILE, '', ':PN');
  625.       (*
  626.       IF ConfVars.GetConfigBool (cUseLongIDs, v.bool) & v.bool
  627.       THEN
  628.         LineOut (INFILE, '', ':TI');
  629.       END;
  630.       *)
  631.       ConfVars.GetConfDefBool (cSendPsn, v.bool, TRUE);
  632.       IF v.bool
  633.       THEN
  634.         LineOut (INFILE, '', ':PSN');
  635.       ELSE
  636.         LineOut (INFILE, '', ':PSA');
  637.       END;
  638.     END;
  639.     IF UserBLK.getOwnPers
  640.     THEN
  641.       LineOut (INFILE, '', ':PE');
  642.     END;
  643.  
  644.     IF UserBLK.getAllg THEN
  645.       LineOut (INFILE, '', ':ON');
  646.     END;
  647.     
  648.     (* Rename-Infos anfordern *)
  649.     LineOut (INFILE, '', ':REN');
  650.     
  651.     (* Maximall„nge einstellen *)
  652.     ConfVars.GetConfDefBool (cMemLine, v.bool, TRUE);
  653.     IF v.bool
  654.     THEN
  655.       GetFreeSpace (numStr);
  656.       mtTextfiles.WriteConst (INFILE, ':M');
  657.       mtTextfiles.WriteLine (INFILE, numStr);
  658.       mtTextfiles.WriteLn (INFILE);
  659.     END;
  660.     
  661.     IF UserBLK.getInf THEN
  662.       Infofiles.LoadInfoInf(FALSE, FALSE);
  663.       isDa := Infofiles.GetInfoCrc (numStr, Infofiles.IFIRST);
  664.       WHILE isDa DO
  665.         LineOut (INFILE, ':', numStr);
  666.         isDa := Infofiles.GetInfoCrc (numStr, Infofiles.INEXT);
  667.       END;
  668.     END;
  669.  
  670.     IF itkCmds
  671.     THEN
  672.       ALLOCATE (itkCmdVal, TSIZE (CatTypes.String1023));
  673.       IF itkCmdVal # NIL
  674.       THEN
  675.         FOR i := 0 TO itkCmdMax DO
  676.           MagicStrings.Assign (cItkCmd, tmpName);
  677.           MagicStrings.Append (StrConv.IntToStr (i,0), tmpName);
  678.           IF ConfVars.GetConfigString (tmpName, itkCmdVal^)
  679.           THEN
  680.             (* Kommando vorhanden *)
  681.             (* Kommandoversion wird nicht abgefragt und verglichen, da ITK
  682.              * momentan nicht im Speicher
  683.              *)
  684.             LineOut (INFILE, ':', itkCmdVal^);
  685.           END;
  686.         END;
  687.         DEALLOCATE (itkCmdVal, 0);
  688.       END;
  689.     END;
  690.  
  691.     IF TrickyOpen(MessagePath, CatTypes.userCmdFile, mtTextfiles.READ, 2048, InHandle) THEN
  692.       Transfer(InHandle, INFILE, 0C);
  693.       mtTextfiles.CloseTextfile(InHandle);
  694.     END;
  695.   END;
  696.   
  697.   FOR i := 0 TO Messages.messages - 1 DO 
  698.     Messages.msgArray^[i].isSend := FALSE; 
  699.     Messages.msgArray^[i].selected := FALSE; 
  700.   END;
  701.   MsgWindow.MsgDeselectAll();
  702.  
  703.   IF UserBLK.statusToIn
  704.   THEN
  705.     (* zuerst die Statusmeldungen *)
  706.     IF TrickyOpen(MessagePath, CatTypes.statusInf, mtTextfiles.READ, 2048, InHandle) THEN
  707.       Transfer(InHandle, INFILE, 0C);
  708.       mtTextfiles.CloseTextfile(InHandle);
  709.     END;
  710.   
  711.     (* Jetzt die Statusmeldungen fr kopierte oder weitergeleitete Messages *)
  712.     FOR i := 0 TO Messages.messages - 1 DO
  713.       CatGlobal.busyMouse();
  714.       msg := Messages.msgArray^[i];
  715.       IF msg.sendMsg & ~msg.toDelete & 
  716.          ((msg.msgType = copyOther) OR (msg.msgType = forward))
  717.       THEN
  718.         IF ~msg.hdrRead
  719.         THEN
  720.           Messages.ReadHdrInfo (msg, TRUE);
  721.           (* Messages.msgArray^[i] := msg; *)
  722.         END;
  723.         IF msg.hdrRead
  724.         THEN
  725.           LineOut (INFILE, '#', msg.refId^);
  726.           mtTextfiles.WriteChar (INFILE, 'B');
  727.           IF msg.msgType = forward THEN 
  728.             mtTextfiles.WriteChar  (INFILE, 'W'); 
  729.           ELSE
  730.             mtTextfiles.WriteChar  (INFILE, 'K'); 
  731.           END;
  732.           mtTextfiles.WriteLn (INFILE);
  733.           LineOut (INFILE, 'K', msg.receiver^);
  734.           IF (msg.topic # NIL) & 
  735.              (LENGTH (msg.topic^) > 0)
  736.           THEN
  737.             LineOut (INFILE, '>', msg.topic^);
  738.           END;
  739.           msg.isSend := TRUE;
  740.           Messages.msgArray^[i] := msg;
  741.         ELSE
  742.         END;
  743.       END;  
  744.     END;
  745.   END;
  746.     
  747.   IF UserBLK.messToIn THEN
  748.     (* Jetzt die einzelnen Messages der Reihe nach transferieren.
  749.      * Wenn eine zu grož werden wrde (Grenze: 14 kB, da Tabs!),
  750.      * dann wird nachgefragt, ob die Nachricht automatisch 
  751.      * gesplittet werden soll, andernfalls wird die nicht versandt!
  752.      *)
  753.     i := 0;
  754.     WHILE i < Messages.messages  DO 
  755.       msg := Messages.msgArray^[i];
  756.       IF msg.sendMsg & ~msg.toDelete & ~msg.isSend & 
  757.          (msg.msgType # copyOwn) 
  758.       THEN
  759.         CatGlobal.busyMouse();
  760.         (* Erst mal testen, ob die Mail zu grož wrde *)
  761.         Messages.Number2Name (msg.number, msgName);
  762.         Strings.Append (CatTypes.textExt, msgName, v.bool);
  763.         msgSize := Messages.FileSize (MessagePath, msgName, cDt, cTi);
  764.         IF (UserBLK.splitSize > 0) & (msgSize > VAL(LONGCARD, UserBLK.splitSize))
  765.         THEN
  766.           IF UserBLK.autoSplit
  767.           THEN
  768.             res := 1;
  769.           ELSE 
  770.             IF ~batchProcess
  771.             THEN
  772.               Strings.Assign (MTE.splitMsgAlt1, alt, v.bool);
  773.               Messages.Number2Name (msg.number, tmpName);
  774.               Strings.Append (tmpName, alt, v.bool);
  775.               Strings.Append (MTE.splitMsgAlt2, alt, v.bool);
  776.               res := mtAlerts.Alert (1, alt);
  777.             ELSE
  778.               res := 2
  779.             END;
  780.           END; 
  781.           IF res = 1
  782.           THEN
  783.             splitMessage (i, msg);
  784.           ELSE
  785.             msg.sendMsg := FALSE;
  786.             Messages.msgArray^[i] := msg;
  787.           END;
  788.         END;
  789.       END;
  790.       INC(i);
  791.     END; (* WHILE *)
  792.     Messages.SortMessages();
  793.     (* Und jetzt die Messages alle ins Infile packen *)
  794.     FOR i := 0 TO Messages.messages - 1 DO 
  795.       msg := Messages.msgArray^[i];
  796.       IF msg.sendMsg & ~msg.isSend &
  797.          (msg.msgType # copyOwn) 
  798.       THEN
  799.         CatGlobal.busyMouse();
  800.         (* Headerinfo schreiben *)
  801.         IF ~msg.hdrRead
  802.         THEN
  803.           Messages.ReadHdrInfo (msg, TRUE);
  804.           (* Messages.msgArray^[i] := msg; *)
  805.         END;
  806.         IF msg.hdrRead
  807.         THEN
  808.           (* Zuerst wird die Message-ID geschrieben *)
  809.           Messages.Number2Name (msg.number, msgName);
  810.           (* Jetzt Id fr Maus erstellen *)
  811.           Messages.MakeMausId (msg, tmpName);
  812.           (* So, und jetzt ab ins Infile damit *)
  813.           LineOut (INFILE, '#', tmpName);
  814.           (* Jetzt kommen die weiteren Infos *)
  815.           CASE msg.msgType OF
  816.             groupcomment,
  817.             mail    : LineOut (INFILE, 'G', msg.group^); |
  818.             persanswer, 
  819.             private : LineOut (INFILE, 'A', msg.receiver^); |
  820.             answer  : IF ~msg.noRefLine
  821.                       THEN
  822.                         LineOut (INFILE, '-', msg.refId^); 
  823.                         LineOut (INFILE, 'A', msg.receiver^);
  824.                       ELSE
  825.                         LineOut (INFILE, 'A', msg.receiver^);
  826.                       END; |
  827.             comment : IF ~msg.noRefLine
  828.                       THEN
  829.                         LineOut (INFILE, '-', msg.refId^);
  830.                         LineOut (INFILE, 'G', msg.group^);
  831.                       ELSE
  832.                         LineOut (INFILE, 'G', msg.group^);
  833.                       END; |
  834.           ELSE
  835.           END (* CASE *);
  836.           IF (msg.topic # NIL)
  837.            & (LENGTH(msg.topic^) > 0)
  838.           THEN
  839.             LineOut (INFILE, 'W', msg.topic^);
  840.           END;
  841.           IF UserBLK.messDateToIn
  842.           THEN
  843.             (* Datum der Nachricht nehmen *)
  844.             Messages.Number2Name (msg.number, msgName);
  845.             Strings.Append (CatTypes.textExt, msgName, v.bool);
  846.             v.lint := Messages.FileSize (MessagePath, msgName, cDt, cTi);
  847.             (* Die Infos haben wir oben schon geholt *)
  848.             (* Jetzt Datum bauen *)
  849.             ConvertDate.MakeFreeDate (cDt, cTi, alt);
  850.             (* E-Zeile in Header sichern *)
  851.             SetHeaderLine (msg, Messages.dateL, alt);
  852.             Messages.WriteHdrInfo (msg);
  853.             (* und ausgeben in Infile *)
  854.             LineOut (INFILE, 'E', alt);
  855.           ELSE
  856.             ConvertDate.MakeDate (alt);
  857.             (* E-Zeile in Header sichern *)
  858.             SetHeaderLine (msg, Messages.dateL, alt);
  859.             (*
  860.             MagicStrings.Assign (alt, msg.date^);
  861.             *)
  862.             Messages.WriteHdrInfo (msg);
  863.             (* und ausgeben in Infile *)
  864.             LineOut (INFILE, 'E', alt);
  865.           END;
  866.           (* Reference-ID *)
  867.           IF (msg.rId # NIL)
  868.            & (LENGTH(msg.rId^) > 0)
  869.           THEN
  870.             (* RId bekommt keine <> mehr drumherum 
  871.             IF (msg.rId^[0] # '<')
  872.             THEN
  873.               tmpName := '<';
  874.               Strings.Append (msg.rId^, tmpName, v.bool);
  875.               Strings.Append ('>', tmpName, v.bool);
  876.               LineOut (INFILE, 'R', tmpName);
  877.             ELSE
  878.             *)
  879.               LineOut (INFILE, 'R', msg.rId^);
  880.             (*
  881.             END;
  882.             *)
  883.           ELSIF (msg.msgType = groupcomment) & (msg.refId # NIL)
  884.           THEN
  885.             (* Ein Gruppenkommentar bekommt auch dann eine R-Zeile, 
  886.              * wenn gar keine I-Zeile da war. Dann nehmen wir die normale Id!
  887.              *)
  888.             (* RId bekommt keine <> mehr drumherum 
  889.              *
  890.             IF (msg.refId^[0] # '<')
  891.             THEN
  892.               tmpName := '<';
  893.               Strings.Append (msg.refId^, tmpName, v.bool);
  894.               Strings.Append ('>', tmpName, v.bool);
  895.               LineOut (INFILE, 'R', tmpName);
  896.             ELSE
  897.             *)
  898.               LineOut (INFILE, 'R', msg.refId^);
  899.             (* END; *)
  900.           END;
  901.           (* Maus 9.0: Distribution ausgeben *)
  902.           IF (msg.dist # data.dNone)
  903.            & ((msg.msgType = mail) OR 
  904.               (msg.msgType = comment) OR 
  905.               (msg.msgType = groupcomment))
  906.           THEN
  907.             LineOut (INFILE, 'D', CHR (ORD('K')+ORD(msg.dist)));
  908.           END;
  909.           (* Jetzt Kopien von eigenen Nachrichten suchen *)
  910.           FOR j := 0 TO Messages.messages - 1 DO
  911.             IF (Messages.msgArray^[j].msgType = copyOwn) 
  912.               & (Messages.msgArray^[j].refNum = msg.number)
  913.               & Messages.msgArray^[j].sendMsg 
  914.               & ~Messages.msgArray^[j].isSend
  915.             THEN
  916.               IF ~Messages.msgArray^[j].hdrRead
  917.               THEN
  918.                 Messages.ReadHdrInfo (Messages.msgArray^[j], TRUE);
  919.               END;
  920.               IF Messages.msgArray^[j].hdrRead
  921.               THEN
  922.                 LineOut (INFILE, 'K', Messages.msgArray^[j].receiver^);
  923.                 (* $ ? Maus_9:  erstmal ganz disabled
  924.                 Messages.Number2Name (Messages.msgArray^[j].number, tmpName);
  925.                 LineOut (INFILE, 'R', tmpName);
  926.                 *)
  927.                 IF (Messages.msgArray^[j].topic # NIL)
  928.                  & (LENGTH(Messages.msgArray^[j].topic^) > 0)
  929.                 THEN
  930.                   LineOut (INFILE, '>', Messages.msgArray^[j].topic^);
  931.                 END;
  932.                 Messages.msgArray^[j].isSend := TRUE;
  933.               END;
  934.             END;
  935.           END;
  936.           (* billige Wildwestverkettung *)
  937.           IF msg.noRefLine & (msg.refId^[0] # '')
  938.           THEN
  939.             LineOut (INFILE, ':-', msg.refId^);
  940.             LineOut (INFILE, ':', '');
  941.           END;
  942.         
  943.           (* Jetzt Messagetext ”ffnen *)
  944.           Messages.Number2Name (msg.number, msgName);
  945.           Strings.Append (CatTypes.textExt, msgName, v.bool);
  946.           IF TrickyOpen (MessagePath, msgName, mtTextfiles.READ, 16348, InHandle)
  947.           THEN
  948.             Transfer (InHandle, INFILE, ':');
  949.             mtTextfiles.CloseTextfile (InHandle);
  950.             IF ((msg.msgType = comment) OR (msg.msgType = groupcomment) OR (msg.msgType = mail))
  951.             THEN
  952.               Strings.Assign (msg.group^, tmpName, v.bool);
  953.               Strings.Upper (tmpName);
  954.               IF Strings.StrEqual (tmpName, devGroup) 
  955.               THEN
  956.                 LineOut (INFILE, ':', '---');
  957.                 LineOut (INFILE, ':', 'CAT '+CatTypes.CatVersion+' vom '+CatTypes.CatDate+0C);
  958.               END;
  959.             END;
  960.             msg.isSend := TRUE;
  961.           ELSE
  962.             (* Header schon geschrieben! Abbruch und Fehlermeldung! *)
  963.             mtTextfiles.CloseTextfile (INFILE);
  964.             mtAppl.MouseArrow();
  965.             MTE.InfoAlert (MTE.noFile1, msgName, "|konnte nicht ge”ffnet werden!|Das Infile wurde nicht korrekt erstellt.][[Abbruch]");
  966.             (* MTE.info (MTE.errorWithInfile); *)
  967.             RETURN FALSE
  968.           END;
  969.         ELSE (* IF msg.hdrRead *)
  970.           (* Fehlermeldung bringen! *)
  971.           Messages.Number2Name (msg.number, msgName);
  972.           Strings.Append (CatTypes.headerExt, msgName, v.bool);
  973.           MTE.InfoAlert (MTE.noFile1, msgName, MTE.noFile4);
  974.         END;
  975.         Messages.msgArray^[i] := msg;
  976.       END;
  977.     END; (* FOR *)
  978.     
  979.   END;
  980.  
  981.   mtTextfiles.WriteChar(INFILE, '#');
  982.   mtTextfiles.WriteLn(INFILE);
  983.   mtTextfiles.CloseTextfile(INFILE);
  984.   
  985.   (* Jetzt vor dem Einpacken eventuelle andere Filter aufrufen 
  986.    *)
  987.   IF ~IoFilter.IoFilterInfile()
  988.   THEN
  989.     mtAppl.MouseArrow();
  990.     RETURN FALSE;
  991.   END;
  992.  
  993.   IF ARCName[0] # 0C THEN
  994.     res := ARCStarter.Archive();
  995.     MagicAES.EvntTimer(400);
  996.     IF (res # 0) & ~batchProcess
  997.     THEN
  998.       mtAppl.MouseArrow();
  999.       MTE.numAlert (res, MTE.pexecError);
  1000.       RETURN FALSE
  1001.     END;
  1002.   END;
  1003.   Protokoll.SendPathUpdate (MessagePath);
  1004.   Protokoll.SendPathUpdate (ExportPath);
  1005.   mtAppl.MouseArrow();
  1006.   RETURN TRUE
  1007. END MakeInFile;
  1008.  
  1009. END MsgInfile.
  1010.